package com.nep.common.util;

import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Screen;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

import static com.nep.common.util.AlertUtil.showError;

/**
 * 场景切换工具类，提供JavaFX场景切换的通用功能
 * 支持从不同触发源(Node/Button/Stage)切换场景
 * 包含FXML加载、窗口居中、错误处理等辅助功能
 */
public class SceneSwitcherUtil {
    private static final Logger LOGGER = Logger.getLogger(SceneSwitcherUtil.class.getName());

    /**
     * 从节点触发场景切换
     * @param sourceNode 触发切换的节点，用于获取当前Stage
     * @param fxmlPath FXML文件路径
     */
    public static void switchScene(Node sourceNode, String fxmlPath) {
        Stage stage = (Stage) sourceNode.getScene().getWindow();
        switchScene(stage, fxmlPath);
    }

    /**
     * 从舞台直接切换场景
     * @param stage 目标舞台
     * @param fxmlPath FXML文件路径
     * @throws IOException FXML加载失败时抛出
     */
    public static void switchScene(Stage stage, String fxmlPath) {
        try {
            Parent root = loadFxml(fxmlPath);
            switchScene(stage, root);
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "场景切换失败", e);
            showError("系统错误", "场景切换失败: " + e.getMessage());
        }
    }

    /**
     * 从按钮触发场景切换，使用已加载的根节点
     * @param button 触发切换的按钮
     * @param root 已加载的场景根节点
     */
    public static void switchScene(Button button, Parent root) {
        Stage stage = (Stage) button.getScene().getWindow();
        switchScene(stage, root);
    }

    /**
     * 核心场景切换方法，设置场景并居中窗口
     * @param stage 目标舞台
     * @param root 场景根节点
     */
    private static void switchScene(Stage stage, Parent root) {
        Scene scene = new Scene(root);
        stage.setScene(scene);
        centerStage(stage);
        stage.show();
    }

    /**
     * 加载FXML文件
     * @param fxmlPath FXML文件路径
     * @return 加载后的根节点
     * @throws IOException 文件不存在或加载失败时抛出
     */
    private static Parent loadFxml(String fxmlPath) throws IOException {
        URL url = SceneSwitcherUtil.class.getResource(fxmlPath);
        if (url == null) {
            throw new IOException("FXML文件未找到: " + fxmlPath);
        }
        FXMLLoader loader = new FXMLLoader(url);
        return loader.load();
    }

    /**
     * 将舞台居中显示在主屏幕
     * @param stage 目标舞台
     */
    private static void centerStage(Stage stage) {
        stage.sizeToScene();
        Screen screen = Screen.getPrimary();
        Rectangle2D bounds = screen.getVisualBounds();
        double x = (bounds.getWidth() - stage.getWidth()) / 2;
        double y = (bounds.getHeight() - stage.getHeight()) / 2;
        stage.setX(x);
        stage.setY(y);
    }
}